#include <iostream>
#include <cstring>
using namespace std;
int n;
char maps1[15][15],maps2[15][15];

bool fun1(int n,char maps[][15]){//顺时针转 90°
	char t[15][15]={0};
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			t[j][n-i+1]=maps[i][j];
		}
	}
	
	for(int i=1;i<=n;i++){
		if(strcmp(&maps2[i][1],&t[i][1])!=0){
			return false;
		}
	}
	return true;
}

bool fun2(int n,char maps[][15]){//图案按顺时针转 180°
	
	char t[15][15]={0};
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			t[n-i+1][n-j+1]=maps[i][j];
		}
	}
	
	for(int i=1;i<=n;i++){
		if(strcmp(&maps2[i][1],&t[i][1])!=0){
			return false;
		}
	}
	return true;
}

bool fun3(int n,char maps[][15]){//图案按顺时针转 270°
	char t[15][15]={0};
	for(int i=1;i<=n;i++){ 
		for(int j=1;j<=n;j++){
			t[n-j+1][i]=maps[i][j];
		}
	}
	
	for(int i=1;i<=n;i++){
		if(strcmp(&maps2[i][1],&t[i][1])!=0){
			return false;
		}
	}
	return true;
}

bool fun4(int n,char maps[][15]){//反射
	char t[15][15]={0};
	for(int i=1;i<=n;i++){ 
		for(int j=1;j<=n;j++){
			t[i][n-j+1]=maps[i][j];
		}
	}
	
	for(int i=1;i<=n;i++){
		if(strcmp(&maps2[i][1],&t[i][1])!=0){
			return false;
		}
	}
	return true;	
}

bool fun5(int n,char maps[][15]){//组合
	char t[15][15]={0};
	for(int i=1;i<=n;i++){ 
		for(int j=1;j<=n;j++){
			t[i][n-j+1]=maps[i][j];
		}
	}
	if(fun1(n,t)||fun2(n,t)||fun3(n,t)){
		return true;
	}else{
		return false;
	}
}

bool fun6(int n,char maps[][15]){//不改变
	for(int i=1;i<=n;i++){
		if(strcmp(&maps2[i][1],&maps[i][1])!=0){
			return false;
		}
	}
	return true;
}

bool (*fun[])(int n,char maps[][15])={0,fun1,fun2,fun3,fun4,fun5,fun6};
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>maps1[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>maps2[i][j];
		}
	}
	for(int i=1;i<=6;i++){
		if(fun[i](n,maps1)){
			cout<<i;
			return 0;
		}
	}
	cout<<7;

	return 0;
}
